================== Os ================== 目标 ==== 本文档以S32K148芯片平台为例,用于指导客户进行OS集成,文档主要包括的内容为:OS集成指导、基于普通应用的集成示例讲解、项目集成特殊说明。 通过阅读本文档,用户可以了解代码集成过程,ORIENTAIS配置工具的配置过程,以及如何应用配置工具生成的配置文件。由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。特定商业项目的主要集成问题,将在项目集成特殊说明章节讲述。 缩写词和术语 ============ +-----------------+------------------------------------------------------+ | **缩写词/术语** | **描述** | +-----------------+------------------------------------------------------+ | AUTOSAR OS | Specification of Operating System | +-----------------+------------------------------------------------------+ | ECU | Electronic Control Unit:电控单元 | +-----------------+------------------------------------------------------+ | MCAL | Microcontroller Abstraction Layer:微控制器抽象层 | +-----------------+------------------------------------------------------+ | MCU | Micro Controller Unit:微处理器 | +-----------------+------------------------------------------------------+ 参考文档 ======== 1. AUTOSAR_SWS_OS.pdf 2. ORIENTAIS_OS_用户手册.pdf 3. ORIENTAIS_Studio_OS_用户手册.pdf 4. OSEK/VDX Operating System.pdf 软件架构 ======== |image1| 图 ORIENTAIS OS 软件架构 OS对外部模块的依赖 ================== +----------+---------------+--------------------------------------------------------------------------------------+ | **编号** | **类别** | **约束限制** | +----------+---------------+--------------------------------------------------------------------------------------+ | **1** | MCAL - MCU | 用户需正确配置MCAL中MCU模块,在启动OS前,用户应调用MCU初始化以确保系统时钟的准确性。 | +----------+---------------+--------------------------------------------------------------------------------------+ 协议栈集成 ========== 普华交付的内容为:协议栈源码和ORIENTAIS Configurator配置工具。 本章节仅描述ORIENTAIS Configurator建立配置工程的方法,不描述如何配置OS,配置示例请参考本文档的章节(集成示例)。 .. table:: 表 OS模块分类 +------------------------------------+---------------------------------+ | **模块名** | **模块分类** | +====================================+=================================+ | Os.h | ORIENTAIS OS 的内核模块。 | +------------------------------------+ | | Os_Alarm.c | | +------------------------------------+ | | Os_Appl.c | | +------------------------------------+ | | Os_Core.c | | +------------------------------------+ | | Os_Counter.c | | +------------------------------------+ | | Os_ECode.h | | +------------------------------------+ | | Os_Err.h | | +------------------------------------+ | | Os_Event.c | | +------------------------------------+ | | Os_Hook.c | | +------------------------------------+ | | Os_Hook.h | | +------------------------------------+ | | Os_Internal.h | | +------------------------------------+ | | Os_Interrupt.c | | +------------------------------------+ | | Os_Ioc.c | | +------------------------------------+ | | Os_Kernel.c | | +------------------------------------+ | | Os_LoadRatio.c | | +------------------------------------+ | | Os_LoadRatio.h | | +------------------------------------+ | | Os_Marcos.h | | +------------------------------------+ | | Os_MemMap.h | | +------------------------------------+ | | Os_Monitor.c | | +------------------------------------+ | | Os_Monitor.h | | +------------------------------------+ | | Os_Mprot.c | | +------------------------------------+ | | Os_Panic.c | | +------------------------------------+ | | Os_Peripheral.c | | +------------------------------------+ | | Os_Resource.c | | +------------------------------------+ | | Os_Rpc.c | | +------------------------------------+ | | Os_ScheduleTable.c | | +------------------------------------+ | | Os_Spinlock.c | | +------------------------------------+ | | Os_Sprot.c | | +------------------------------------+ | | Os_StackMonitor.c | | +------------------------------------+ | | Os_Task.c | | +------------------------------------+ | | Os_Tprot.c | | +------------------------------------+ | | Os_Trace.c | | +------------------------------------+ | | Os_Trace.h | | +------------------------------------+ | | Os_Types.h | | +------------------------------------+---------------------------------+ | Os_Extend.c | 扩展功能 | +------------------------------------+ | | Os_Extend.h | | +------------------------------------+---------------------------------+ | Mcu_Core.c | 移植相关 | +------------------------------------+ | | Mcu_Core.h | | +------------------------------------+ | | Mcu_Irq.h | | +------------------------------------+ | | Mcu_Timer.c | | +------------------------------------+ | | Mcu_Timer.h | | +------------------------------------+ | | Os_MemmapImp.h | | +------------------------------------+ | | Arch_Context.s | | +------------------------------------+ | | Arch_Define.h | | +------------------------------------+ | | Arch_Extend.c | | +------------------------------------+ | | Arch_Extend.h | | +------------------------------------+ | | Arch_Irq.c | | +------------------------------------+ | | Arch_Irq.h | | +------------------------------------+ | | Arch_Mpu.c | | +------------------------------------+ | | Arch_Mpu.h | | +------------------------------------+ | | Arch_Processor.c | | +------------------------------------+ | | Arch_Processor.h | | +------------------------------------+ | | Arch_Trap.c | | +------------------------------------+---------------------------------+ | Ioc.c | 配置文件 | +------------------------------------+ | | Ioc.h | | +------------------------------------+ | | Os_Cfg.c | | +------------------------------------+ | | Os_Cfg.h | | +------------------------------------+ | | Os_CfgData.h | | +------------------------------------+ | | Os_Cfg_S.h | | +------------------------------------+ | | Os_CoreCfg.c | | +------------------------------------+ | | Os_CoreCfg.h | | +------------------------------------+ | | Os_DataSection.lsl | | +------------------------------------+ | | Os_Intvet.c | | +------------------------------------+ | | Os_Kdata.c | | +------------------------------------+ | | Os_Linker.ld | | +------------------------------------+ | | Os_Mp_MemMap.h | | +------------------------------------+ | | Os_MprotCfg.c | | +------------------------------------+ | | Os_MprotCfg.h | | +------------------------------------+ | | Os_Trace.orti | | +------------------------------------+ | | Os_UserInf.c | | +------------------------------------+---------------------------------+ .. table:: 表 协议栈集成的步骤 +----------+----------------------------------------------+------------------------------------------------------+ | **步骤** | **操作** | **说明** | +----------+----------------------------------------------+------------------------------------------------------+ | 1 | ORIENTAIS | 若配置工具已经搭建,则仅需进行协议栈模块的加载操作。 | | | Configurator配置工具工程搭建和协议栈模块加载 | | +----------+----------------------------------------------+------------------------------------------------------+ | 2 | 模块配置及配置文件生成 | NA | +----------+----------------------------------------------+------------------------------------------------------+ | 3 | 代码集成 | 现有工程、协议栈源代码和配置生成文件的集成。 | +----------+----------------------------------------------+------------------------------------------------------+ | 4 | 验证测试 | NA | +----------+----------------------------------------------+------------------------------------------------------+ 新建ORIENTAIS Configurator配置工程 ---------------------------------- #. 安装ORIENTAIS Configurator软件后,双击软件图标打开软件。 |image2| 图 新建工程-1 #. 菜单栏File🡪New🡪Project,新建工程。 |image3| 图 新建工程-2 #. 在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。 |image4| 图 新建工程-3 #. 在弹出的窗口中输入工程名,选择Finish。 |image5| 图 新建工程-4 #. 选择[Bsw_Builder],右键单击,选择New ECU Configuration。 |image6| 图 新建ECU #. 在弹出的窗口中输入ECU名,选择S32K148芯片,然后选择Next。 |image7| 图 选择芯片平台 #. 在弹出的窗口中勾选需添加的模块,点击Finish。 |image8| 图 完成ECU配置 #. 新建工程如下图所示。 |image9| 图 完成新建工程 模块配置及生成代码 ------------------ 模块配置 ~~~~~~~~ 模块的具体配置,取决于具体的项目需求。OS各模块配置项的详细介绍,请参考ORIENTAIS OS_用户手册.pdf。 配置代码生成 ~~~~~~~~~~~~ #. 在ORIENTAIS Configurator主界面左方,选择对应的协议栈,单击右键弹出Validate和Generate菜单。 |image10| 图 代码生成 #. 选择Validate 对本协议栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。 #. 选择Generate,生成配置文件。右下角的Console窗口输出生成的配置文件信息。 |image11| 图 代码生成提示界面 #. 在ORIENTAIS Configurator主界面左方,即可查看生成的配置文件。 |image12| 图 生成的配置文件 功能集成 -------- 此章节用于指导用户在集成OS过程中应注意一些事项。 代码集成 ~~~~~~~~ 协议栈代码包括两部分:普华提供的协议栈源码和ORIENTAIS Configurator配置生成代码。 用户须将协议栈源码和章节(模块配置及生成代码)生成的源代码添加到集成开发工具的对应文件夹。 .. note:: **OS集成之前,需确保MCU时钟的正确性。** 集成注意事项 ~~~~~~~~~~~~ 对于集成过程中,OS特殊要求和用户经常出现的问题,归类总结形成表 协议栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。 .. table:: 表 协议栈集成约束清单 +----------+------------+------------------------------------------------------------+ | **编号** | **类别** | **约束限制** | +==========+============+============================================================+ | **1** | 堆栈 | 用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间 | +----------+------------+------------------------------------------------------------+ | **2** | 头文件 | - 添加协议栈代码之后,用户需更新集成开发工具中的头文件路径 | | | | | | | | - 调用协议栈API的源文件,需要包含协议栈的头文件 | +----------+------------+------------------------------------------------------------+ | **3** | MCU初始化 | 用户应调用Mcu_Init()以初始化系统时钟 | +----------+------------+------------------------------------------------------------+ | **4** | 启动OS | 用户应调用StartOS()以启动OS | +----------+------------+------------------------------------------------------------+ 集成示例 ======== 本章节通过OS为例,向用户展示OS的集成过程。用户可以据此熟悉OS配置工具的配置过程,以及如何应用配置工具生成的配置文件。 .. note:: **本示例配置为1核且可扩展类为SC1模式。该示例仅包含基础配置,故下面配置为部分OS配置。** 集成目标 -------- 通过搭建基础工程,实现OS的基本功能(即:任务调度功能)。 .. table:: 表 配置目标 +--------------------+--------------------+--------------------+--------------------+ | TASK | +--------------------+--------------------+--------------------+--------------------+ | Name | Priority | Preemptive Poilcy | Activation Limit | +--------------------+--------------------+--------------------+--------------------+ | Core0_Task | 1 | FULL | 1 | +--------------------+--------------------+--------------------+--------------------+ | Auto start | | | | +--------------------+--------------------+--------------------+--------------------+ | False | | | | +--------------------+--------------------+--------------------+--------------------+ | Alarm | +--------------------+--------------------+--------------------+--------------------+ | Name | Activate | Counter | Task | +--------------------+--------------------+--------------------+--------------------+ | Core0_Alarm | Activate Task | SystemTimer_Core_0 | Core0_Task | +--------------------+--------------------+--------------------+--------------------+ | ISR | +--------------------+--------------------+--------------------+--------------------+ | Name | Category | Priority | Nested Enable | +--------------------+--------------------+--------------------+--------------------+ | CAN0_ORed_ADDR | GATEGORY_2 | 1 | False | +--------------------+--------------------+--------------------+--------------------+ 模块的配置 ---------- #. OsOS界面配置如下: |image13| 图 OsOS 配置 +----------------------------------+-----------------------------------+ | 配置项名 | 描述 | +----------------------------------+-----------------------------------+ | Cores Number | 配置OS为1核。 | +----------------------------------+-----------------------------------+ | Map CPU | 将单核OS映射至核0运行。 | +----------------------------------+-----------------------------------+ | Scalability Class | 将OS功能裁减为SC1下的功能。 | +----------------------------------+-----------------------------------+ | Os Status | 设置OS的状态为EXTENED模式。 | +----------------------------------+-----------------------------------+ | Error Hook | 开启错误钩子函数 | +----------------------------------+-----------------------------------+ | Shutdown Hook | 开启关闭钩子函数 | +----------------------------------+-----------------------------------+ | Startup Hook | 开启启动钩子函数 | +----------------------------------+-----------------------------------+ #. SystemTimer配置界面如下: |image14| 图 SystemTimer配置 +----------------------------+-----------------------------------------+ | 配置项名 | 描述 | +----------------------------+-----------------------------------------+ | STM_Frequency[MHZ] | 系统时钟频率:48MHZ | +----------------------------+-----------------------------------------+ | Priority | 设置系统中断的优先级为:10 | +----------------------------+-----------------------------------------+ | Nest Enable | 设置该系统中断是否支持嵌套功能 | +----------------------------+-----------------------------------------+ | TickTime[s] | 设置系统中断周期时间为:0.001s | +----------------------------+-----------------------------------------+ #. OsCounter配置界面如下: |image15| 图 OsCounter配置 +------------------+---------------------------------------------------+ | 配置项名 | 描述 | +------------------+---------------------------------------------------+ | Max Tick | 设置系统Counter的最大tick值为:65535 Tick。 | +------------------+---------------------------------------------------+ | Min Cycle | 设置系统Counter的最小tick值为:1 Tick。 | +------------------+---------------------------------------------------+ #. OsAppMode配置如下: |image16| 图 OsAppMode配置 +------------------+---------------------------------------------------+ | 配置项名 | 描述 | +------------------+---------------------------------------------------+ | OsAppMode | 设置OS的工作模式:OSDEFAULTAPPMODE。 | +------------------+---------------------------------------------------+ #. OsTask配置界面如下: |image17| 图 OsTask配置-1 |image18| 图 OsTask配置-2 +---------------------+------------------------------------------------+ | 配置项名 | 描述 | +---------------------+------------------------------------------------+ | Activation Limit | 设置该任务能被连续激活的次数:允许连续激活1次 | +---------------------+------------------------------------------------+ | Priority | 设置任务的优先级为:1 | +---------------------+------------------------------------------------+ | Preemptive Policy | 设置该任务的抢占策略为:FULL | +---------------------+------------------------------------------------+ | Stack Size | 设置任务的堆栈为:256(单位:4bytes) | +---------------------+------------------------------------------------+ #. OsAlarm界面配置如下: |image19| 图 OsAlarm配置-1 |image20| 图 OsAlarm配置-2 +---------------------+------------------------------------------------+ | 配置项名 | 描述 | +---------------------+------------------------------------------------+ | Counter Ref | 选择驱动Alarm的Counter:SystemTimer_Core_0。 | +---------------------+------------------------------------------------+ | OsAlarmActivateTask | 选择Alarm到期后的动作为:激活Core0_Task。 | +---------------------+------------------------------------------------+ | OsAlarmAutostart | 设置Alarm启动方式:自启动。 | +---------------------+------------------------------------------------+ | Start Time[tick] | 设置Alarm的启动偏移tick值为:100 Tick。 | +---------------------+------------------------------------------------+ | Autosar Type | 设置该Alarm的启动方式为:相对启动。 | +---------------------+------------------------------------------------+ | Cycle Time[tick] | 设置该周期Alarm的tick值为:100 Tick。 | +---------------------+------------------------------------------------+ | AppMode | 设置该Alarm的启动模式为:OSDEFAULTAPPMODE | +---------------------+------------------------------------------------+ #. OsIsr配置界面如下: |image21| 图 OsIsr配置 +---------------+------------------------------------------------------+ | 配置项名 | 描述 | +---------------+------------------------------------------------------+ | Category | 配置CAN0_ORed_ADDR中断为:CATEGORY_2 | +---------------+------------------------------------------------------+ | Stack Size | 设置CAN0_ORed_ADDR中断栈空间为:128(单位:4bytes) | +---------------+------------------------------------------------------+ | Priority | 设置CAN0_ORed_ADDR中断的优先级为:1 | +---------------+------------------------------------------------------+ | Nested Enable | 设置中断嵌套功能:不开启总的嵌套。 | +---------------+------------------------------------------------------+ .. _配置代码生成-1: 配置代码生成 ------------ 请参考本文档的章节(模块配置及生成代码)。 源代码集成 ---------- 普华交付给用户的工程结构如下: |image22| 图 目录结构 - BSW_Config目录,这个目录用来存放配置工具生成的配置文件。 - SystemServices目录,存放模块相关的源代码。 集成步骤 -------- OS代码集成步骤如下: #. 将章节(模块配置及生成代码)中ORIENTAIS Configurator生成的配置文件复制到BSW/Config/BSW_Config文件夹中。 #. 将普华提供的协议栈源代码文件复制到BSW/SystemServices文件夹中。 协议栈调度集成 -------------- OS调度集成步骤如下: #. 协议栈调度集成,需要逐一排查并实现表 协议栈集成约束清单所罗列的问题,以避免集成出现差错。 #. 执行编译、链接操作生成elf文件,并将elf文件烧写到目标板中。 MCU初始化相关的代码,在下方的main.c文件中给出重点标注。 .. code-block:: c :linenos: :emphasize-lines: 4-5, 7-8, 10 // 初始化MCU时钟 int main(void) { Mcu_Init(Mcu_ConfigRoot); // 初始化MCU模块,加载配置参数 Mcu_InitClock(0); // 初始化时钟,参数0表示使用默认时钟配置 /* 等待PLL锁定 */ while (MCU_PLL_UNLOCKED == Mcu_GetPllStatus()); // 循环等待PLL稳定 Mcu_DistributePllClock(); // 分发PLL时钟到各外设 StartOS(OSDEFAULTAPPMODE); // 启动操作系统,使用默认应用模式 /* 无限循环(理论上不会执行到此处) */ while (1) { } return 1; } 验证结果 -------- 在调试软件界面点击全速运行,周期任务能够按照周期时间执行,达到了集成目标的要求。 .. |image1| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image2.png :width: 8.76736in :height: 5.2125in .. |image2| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image3.png :width: 5.76736in :height: 3.2125in .. |image3| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image4.png :width: 5.76736in :height: 3.2125in .. |image4| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image5.png :width: 5.76736in :height: 3.2125in .. |image5| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image6.png :width: 5.76736in :height: 3.2125in .. |image6| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image7.png :width: 5.76736in :height: 3.2125in .. |image7| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image8.png :width: 5.76736in :height: 6.0125in .. |image8| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image9.png :width: 5.76736in :height: 5.2125in .. |image9| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image10.png :width: 5.76736in :height: 3.2125in .. |image10| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image11.png :width: 5.76736in :height: 3.2125in .. |image11| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image12.png :width: 5.76736in :height: 6.0125in .. |image12| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image13.png :width: 3.76736in :height: 7.2125in .. |image13| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image14.png :width: 5.76736in :height: 3.2125in .. |image14| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image15.png :width: 5.76736in :height: 3.2125in .. |image15| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image16.png :width: 5.76736in :height: 3.2125in .. |image16| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image17.png :width: 5.76736in :height: 3.2125in .. |image17| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image18.png :width: 5.76736in :height: 3.2125in .. |image18| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image19.png :width: 5.76736in :height: 3.2125in .. |image19| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image20.png :width: 5.76736in :height: 4.3125in .. |image20| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image21.png :width: 5.76736in :height: 3.2125in .. |image21| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image22.png :width: 4.76736in :height: 3.9125in .. |image22| image:: /_static/集成手册(Integration_Instruction_Manual)/集成手册_Os/image23.png :width: 5.76736in :height: 3.2125in